package com.dongdongshop.service.impl;

import com.dongdongshop.pojo.TbItem;
import com.dongdongshop.pojo.TbOrderItem;
import com.dongdongshop.service.CartService;
import com.dongdongshop.service.ItemService;
import com.dongdongshop.vo.CartVO;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
@DubboService
public class CartServiceImpl implements CartService {

    @DubboReference
    private ItemService itemService;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<CartVO> addCart(List<CartVO> cartList, Long skuId, Integer num) {
        //1.根据skuId查询sku数据(item)
        TbItem tbItem = itemService.selectById(skuId);
        //2.判断我们当前买的商品是不是之前在购物车买过的商家
        //获取商家ID
        String sellerId = tbItem.getSellerId();
        //老的购物车
        CartVO oldCart = getCartFromCartListBySellerId(cartList, sellerId);
        //如果不是就创建一个新的购物车(cart) 然后数据放进去,然后把cart放到cartList
        //如果老车里面是空的就是之前没买过就创建新购物车
        if (oldCart == null){
            //创建新的购物车
            oldCart = new CartVO();
            //把sellerId set进去
            oldCart.setSellerId(sellerId);
            //创建一个list用来装商品
            List<TbOrderItem> orderItemList = new ArrayList<>();
            //创建一个TbOrderItem对象 用来接收item数据
            TbOrderItem tbOrderItem = new TbOrderItem();
            tbOrderItem.setSellerId(sellerId);
            tbOrderItem.setNum(num);
            tbOrderItem.setGoodsId(tbItem.getGoodsId());
            tbOrderItem.setPrice(tbItem.getPrice());
            tbOrderItem.setItemId(tbItem.getId());
            //总金额
            tbOrderItem.setTotalFee(new BigDecimal(tbItem.getPrice().doubleValue() * num));
            tbOrderItem.setTitle(tbItem.getTitle());
            tbOrderItem.setPicPath(tbItem.getImage());
            //将新建的购物明细数据  放到购物明细列表中
            orderItemList.add(tbOrderItem);
            //将购物车明细列表数据放到购物中
            oldCart.setOrderItemList(orderItemList);
            //将购物车放到购物列表中
            cartList.add(oldCart);

        }else {
            //2.2如果是  也就是说如果我们以前购物车中买过这家商家的商品的话
            //2.3. 如果我们只买过这家商品 但是上次买的是火箭 这次买的是飞机
            //拿到原来的商品 判断有没有在这家买过
            List<TbOrderItem> orderItemList = oldCart.getOrderItemList();
            TbOrderItem tbOrderItem = getOrderItmeFromOrderItemListByItemId(orderItemList, tbItem.getId());
            if (tbOrderItem == null){
                tbOrderItem = new TbOrderItem();
                tbOrderItem.setSellerId(sellerId);
                tbOrderItem.setNum(num);
                tbOrderItem.setGoodsId(tbItem.getGoodsId());
                tbOrderItem.setPrice(tbItem.getPrice());
                tbOrderItem.setItemId(tbItem.getId());
                //总金额
                tbOrderItem.setTotalFee(new BigDecimal(tbItem.getPrice().doubleValue() * num));
                tbOrderItem.setTitle(tbItem.getTitle());
                tbOrderItem.setPicPath(tbItem.getImage());
                //将新商品追加到明细列表中
                orderItemList.add(tbOrderItem);
            }else {
                //如果是这家商家的同一件商品
                //我们只需要修改商品数量与总金额
                tbOrderItem.setNum(tbOrderItem.getNum()+num);
                tbOrderItem.setTotalFee(new BigDecimal(tbOrderItem.getNum() * tbItem.getPrice().doubleValue()));
                //如果我们剪完商品数量后 他的数量为0时就要把它从明细列表中干掉
                if (tbOrderItem.getNum().intValue() <= 0){
                    orderItemList.remove(tbOrderItem);
                }
                //如果移出去之后明系列表没有数据了,n那么我们就要将当前的购物车从购物车列表中删除
                if (orderItemList.size() <= 0){
                    cartList.remove(oldCart);
                }
            }
        }
        return cartList;
    }

    //根据商家id从原来的购物列表中查询购物车的数据
    private CartVO getCartFromCartListBySellerId(List<CartVO> cartList,String sellerId){
        for (CartVO cartVO : cartList) {
            if (cartVO.getSellerId().equals(sellerId)){
                return cartVO;
            }
        }
        return null;
    }

    //根据商品的Id从原来商家的购物车明细列表中查询有没有买过这件商品
    private TbOrderItem getOrderItmeFromOrderItemListByItemId(List<TbOrderItem> orderItemList,Long itemId){
        for (TbOrderItem tbOrderItem : orderItemList) {
            if (tbOrderItem.getItemId().equals(itemId)){
                return tbOrderItem;
            }
        }
        return null;
    }

    @Override
    public List<CartVO> selectCartListFromRedis(Long id) {
         List<CartVO> cartVOS = (List<CartVO>) redisTemplate.boundHashOps("CartList").get(id);
        return cartVOS == null ? new ArrayList<>() : cartVOS;
    }

    @Override
    public void addCartListToRedis(List<CartVO> cartList, Long id) {
         redisTemplate.boundHashOps("CartList").put(id,cartList);
    }

    //合并购物车
    @Override
    public List<CartVO> mergeCartList(List<CartVO> cartVOS, List<CartVO> cartListFromRedis) {
        for (CartVO cartVO : cartVOS) {
            List<TbOrderItem> orderItemList = cartVO.getOrderItemList();
            for (TbOrderItem tbOrderItem : orderItemList) {
                cartListFromRedis = addCart(cartListFromRedis,tbOrderItem.getItemId(),tbOrderItem.getNum());
            }
        }
        return cartListFromRedis;
    }
}
